package junit.runner; import java.lang.reflect.Modifier; import junit.framework.Test; /** * An implementation of a TestCollector that loads * all classes on the class path and tests whether * it is assignable from Test or provides a static suite method. * @see TestCollector */ public class LoadingTestCollector extends ClassPathTestCollector { TestCaseClassLoader fLoader; public LoadingTestCollector() { fLoader = new TestCaseClassLoader(); } protected boolean isTestClass(String classFileName) { try { if (classFileName.endsWith(".class")) { Class testClass = classFromFile(classFileName); return (testClass != null) && isTestClass(testClass); } } catch (ClassNotFoundException expected) { } catch (NoClassDefFoundError notFatal) { } return false; } Class classFromFile(String classFileName) throws ClassNotFoundException { String className = classNameFromFile(classFileName); if (!fLoader.isExcluded(className)) return fLoader.loadClass(className, false); return null; } boolean isTestClass(Class testClass) { if (hasSuiteMethod(testClass)) return true; if (Test.class.isAssignableFrom(testClass) && Modifier.isPublic(testClass.getModifiers()) && hasPublicConstructor(testClass)) return true; return false; } boolean hasSuiteMethod(Class testClass) { try { testClass.getMethod(BaseTestRunner.SUITE_METHODNAME, new Class[0]); } catch (Exception e) { return false; } return true; } boolean hasPublicConstructor(Class testClass) { Class[] args = { String.class }; try { testClass.getConstructor(args); } catch (Exception e) { return false; } return true; } }